package StrategyPattern

//策略模式

//
// IStrategy
// @Description:
//
type IStrategy interface {
	do(int, int) int
}

//
// Add
// @Description: 策略实现：加
//
type Add struct {
}

// do
// @author: lhg
// @Date: 2021-08-11 16:15:58
// @Description:
// @receiver *add
// @param a int
// @param b int
// @return int
//
func (*Add) do(a, b int) int {
	return a + b
}

//
// Reduce
// @Description:策略实现：减
//
type Reduce struct {
}

// do
// @author: lhg
// @Date: 2021-08-11 16:17:21
// @Description:
// @receiver *reduce
// @param a int
// @param b int
// @return int
//
func (*Reduce) do(a, b int) int {
	return a - b
}

//
// Operator
// @Description: 具体策略的执行者
//
type Operator struct {
	Strategy IStrategy
}

// SetOperator
// @author: lhg
// @Date: 2021-08-11 16:19:35
// @Description: 设置策略
// @receiver operator
// @param strategy IStrategy
//
func (operator *Operator) SetOperator(strategy IStrategy) {
	operator.Strategy = strategy
}

// Calculate
// @author: lhg
// @Date: 2021-08-11 16:21:05
// @Description: 调用策略中的方法
// @receiver operator
// @param a int
// @param b int
// @return int
//
func (operator *Operator) Calculate(a, b int) int {
	return operator.Strategy.do(a, b)
}
